package com.scheduling.product.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.scheduling.product.dto.OperationDTO;
import com.scheduling.product.entity.Operation;
import lombok.Data;

import java.util.List;

/**
 * 工序业务层接口
 *
 * @author 开发团队
 * @since 2025-05-29
 */
public interface OperationService extends IService<Operation> {

    /**
     * 根据工艺路线ID获取工序列表
     *
     * @param routeId 工艺路线ID
     * @return 工序列表（包含原料信息）
     */
    List<OperationDTO> getOperationsByRouteId(String routeId);

    /**
     * 根据ID获取工序详情（DTO版本，包含原料信息）
     *
     * @param operationId 工序ID
     * @return 工序详情（包含原料信息）
     */
    OperationDTO getOperationDetailById(String operationId);

    /**
     * 添加工序
     *
     * @param operationDTO 工序信息
     * @return 添加结果
     */
    boolean addOperation(OperationDTO operationDTO);

    /**
     * 更新工序
     *
     * @param operationDTO 工序信息
     * @return 更新结果
     */
    boolean updateOperation(OperationDTO operationDTO);

    /**
     * 删除工序
     *
     * @param operationId 工序ID
     * @return 删除结果
     */
    boolean deleteOperation(String operationId);

    /**
     * 批量删除工序
     *
     * @param operationIds 工序ID列表
     * @return 删除结果
     */
    boolean deleteOperations(List<String> operationIds);

    /**
     * 根据工艺路线ID删除所有工序
     *
     * @param routeId 工艺路线ID
     * @return 删除结果
     */
    boolean deleteOperationsByRouteId(String routeId);

    /**
     * 检查工序编号在工艺路线内是否存在
     *
     * @param routeId       工艺路线ID
     * @param operationCode 工序编号
     * @param excludeId     排除的ID（更新时使用）
     * @return 是否存在
     */
    boolean checkOperationCodeExists(String routeId, String operationCode, String excludeId);

    /**
     * 检查工序序号在工艺路线内是否存在
     *
     * @param routeId    工艺路线ID
     * @param sequenceNo 工序序号
     * @param excludeId  排除的ID（更新时使用）
     * @return 是否存在
     */
    boolean checkSequenceNoExists(String routeId, Integer sequenceNo, String excludeId);

    /**
     * 根据机器类型ID查询工序列表
     *
     * @param machineTypeId 机器类型ID
     * @return 工序列表
     */
    List<Operation> getOperationsByMachineTypeId(String machineTypeId);

    /**
     * 工序序号DTO
     */
    @Data
    class OperationSequenceDTO {
        private String operationId;
        private Integer sequenceNo;
    }
} 